package com.wmx.jdbc_template_app.config;

import com.wmx.jdbc_template_app.controller.PhoneController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * 应用配置类
 * 1、自定义 DataSourceTransactionManager 数据源事务管理器
 * 2、IOC容器(ApplicationContext)自动注入并使用 ApplicationContext
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/4/21 21:28
 */
@Configuration
public class AppConfig {

    private static final Logger log = LoggerFactory.getLogger(AppConfig.class);

    /**
     * ========= 自定义 DataSourceTransactionManager 数据源事务管理器 =========
     * 1、如果程序中有多个数据源(javax.sql.DataSource),且没有设置首选 Bean (如@Primary标识)，需要手动为 DataSourceTransactionManager 绑定需要的数据源
     * 2、采用配置类的形式，将其添加到容器中，这样程序中可以直接 @Autowired 或者 @Resource 注入使用。
     * 3、当然不在配置类中添加实例，直接在需要的地方 new DataSourceTransactionManager(DataSource dataSource) 也是可以的，同样放入目标数据源即可。
     * 4、使用 Qualifier 指定对应名称的数据源进行注入
     * <p>
     * <p>
     * ========= IOC容器(ApplicationContext)自动注入并使用 ApplicationContext =========
     * 1、@Bean 添加实例时，方法中的参数可以获取容器中的任意实例，比如数据源-DataSource，IOC容器自身-ApplicationContext
     * 2、@Bean 添加实例时，如果容器中同一类型存在多个实例，且没有标记优先级时，则需要使用 Qualifier 注解指定实例名称
     */
    @Bean
    public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource, ApplicationContext applicationContext) {
        // 程序一启动就会执行本方法，然后从容器中获取实例，查询数据库数据
        PhoneController phoneController1 = applicationContext.getBean(PhoneController.class);
        List<Map<String, Object>> mapList2 = phoneController1.userList();
        log.info("\r\n{}", mapList2);
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
        return transactionManager;
    }
}
